//package com.whjfxx.terminal.utils;
//
//import org.apache.http.*;
//import org.apache.http.client.HttpRequestRetryHandler;
//import org.apache.http.client.config.RequestConfig;
//import org.apache.http.client.entity.UrlEncodedFormEntity;
//import org.apache.http.client.methods.CloseableHttpResponse;
//import org.apache.http.client.methods.HttpGet;
//import org.apache.http.client.methods.HttpPost;
//import org.apache.http.client.protocol.HttpClientContext;
//import org.apache.http.client.utils.URIBuilder;
//import org.apache.http.config.Registry;
//import org.apache.http.config.RegistryBuilder;
//import org.apache.http.conn.routing.HttpRoute;
//import org.apache.http.conn.socket.ConnectionSocketFactory;
//import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
//import org.apache.http.conn.socket.PlainConnectionSocketFactory;
//import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
//import org.apache.http.entity.ContentType;
//import org.apache.http.entity.StringEntity;
//import org.apache.http.impl.client.CloseableHttpClient;
//import org.apache.http.impl.client.HttpClients;
//import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
//import org.apache.http.message.BasicNameValuePair;
//import org.apache.http.util.EntityUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import javax.net.ssl.SSLException;
//import javax.net.ssl.SSLHandshakeException;
//import java.io.IOException;
//import java.io.InterruptedIOException;
//import java.net.URI;
//import java.net.UnknownHostException;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * Created by b.c on 2022/1/14 14:54
// */
//public final class HttpClientUtil {
//
//    Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
//
//    /**
//     *
//     */
//    private static CloseableHttpClient httpclient = null;
//
//    /**
//     * ms毫秒,从池中获取链接超时时间
//     */
//    static final int connectionRequestTimeout = 5000;
//
//    /**
//     * ms毫秒,建立链接超时时间
//     */
//    static final int connectTimeout = 5000;
//
//    /**
//     * ms毫秒,读取超时时间
//     */
//    static final int socketTimeout = 30000;
//
//    /**
//     * 最大总并发,很重要的参数
//     */
//    static final int maxTotal = 500;
//
//    /**
//     * 每路并发,很重要的参数
//     */
//    static final int maxPerRoute = 100;
//
//    /**
//     * 每个细化配置之ip(不重要,在特殊场景很有用)
//     */
//    static final String detailHostName = "http://www.baidu.com";
//
//    /**
//     * 每个细化配置之port(不重要,在特殊场景很有用)
//     */
//    static final int detailPort = 80;
//
//    /**
//     * 每个细化配置之最大并发数(不重要,在特殊场景很有用)
//     */
//    static final int detailMaxPerRoute = 100;
//
//    private static CloseableHttpClient getHttpClient() {
//        if (null == httpclient) {
//            synchronized (HttpClientUtil.class) {
//                if (null == httpclient) {
//                    httpclient = init();
//                }
//            }
//        }
//        return httpclient;
//    }
//
//    /**
//     * 链接池初始化 这里最重要的一点理解就是. 让CloseableHttpClient 一直活在池的世界里, 但是HttpPost却一直用完就消掉.
//     * 这样可以让链接一直保持着.
//     */
//    private static CloseableHttpClient init() {
//        CloseableHttpClient newHttpclient;
//
//        // 设置连接池
//        ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory();
//        LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory.getSocketFactory();
//        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", plainsf).register("https", sslsf).build();
//        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
//        // 将最大连接数增加
//        cm.setMaxTotal(maxTotal);
//        // 将每个路由基础的连接增加
//        cm.setDefaultMaxPerRoute(maxPerRoute);
//
//        // 细化配置开始,其实这里用Map或List的for循环来配置每个链接,在特殊场景很有用.
//        // 将每个路由基础的连接做特殊化配置,一般用不着
//        HttpHost httpHost = new HttpHost(detailHostName, detailPort);
//        // 将目标主机的最大连接数增加
//        cm.setMaxPerRoute(new HttpRoute(httpHost), detailMaxPerRoute);
//        // 细化配置结束
//
//        // 请求重试处理
//        HttpRequestRetryHandler httpRequestRetryHandler = (exception, executionCount, context) -> {
//            if (executionCount >= 2) {// 如果已经重试了2次，就放弃
//                return false;
//            }
//            if (exception instanceof NoHttpResponseException) {// 如果服务器丢掉了连接，那么就重试
//                return true;
//            }
//            if (exception instanceof SSLHandshakeException) {// 不要重试SSL握手异常
//                return false;
//            }
//            if (exception instanceof InterruptedIOException) {// 超时
//                return false;
//            }
//            if (exception instanceof UnknownHostException) {// 目标服务器不可达
//                return false;
//            }
//            if (exception instanceof SSLException) {// SSL握手异常
//                return false;
//            }
//
//            HttpClientContext clientContext = HttpClientContext.adapt(context);
//            HttpRequest request = clientContext.getRequest();
//            // 如果请求是幂等的，就再次尝试
//            return !(request instanceof HttpEntityEnclosingRequest);
//        };
//
//        // 配置请求的超时设置
//        RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(connectionRequestTimeout).setConnectTimeout(connectTimeout).setSocketTimeout(socketTimeout).build();
//        newHttpclient = HttpClients.custom().setConnectionManager(cm).setDefaultRequestConfig(requestConfig).setRetryHandler(httpRequestRetryHandler).build();
//        return newHttpclient;
//    }
//
//    public static String doGet(String url, Map<String, String> param) {
//
//        // 创建Httpclient对象
//        CloseableHttpClient httpclient = getHttpClient();
//
//        String resultString = "";
//        CloseableHttpResponse response = null;
//        try {
//            // 创建uri
//            URIBuilder builder = new URIBuilder(url);
//            if (param != null) {
//                for (String key : param.keySet()) {
//                    builder.addParameter(key, param.get(key));
//                }
//            }
//            URI uri = builder.build();
//
//            // 创建http GET请求
//            HttpGet httpGet = new HttpGet(uri);
//
//            // 执行请求
//            response = httpclient.execute(httpGet);
//            // 判断返回状态是否为200
//            if (response.getStatusLine().getStatusCode() == 200) {
//                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                if (response != null) {
//                    response.close();
//                }
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//        return resultString;
//    }
//
//    public static String doGet(String url) {
//        return doGet(url, null);
//    }
//
//    public static String doPost(String url, Map<String, String> param) {
//        // 创建Httpclient对象
//        CloseableHttpClient httpClient = getHttpClient();
//        CloseableHttpResponse response = null;
//        String resultString = "";
//        try {
//            // 创建Http Post请求
//            HttpPost httpPost = new HttpPost(url);
//            // 创建参数列表
//            if (param != null) {
//                List<NameValuePair> paramList = new ArrayList<>();
//                for (String key : param.keySet()) {
//                    paramList.add(new BasicNameValuePair(key, param.get(key)));
//                }
//                // 模拟表单
//                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8");
//                httpPost.setEntity(entity);
//            }
//            // 执行http请求
//            response = httpClient.execute(httpPost);
//            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                response.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//
//        return resultString;
//    }
//
//    public static String doPost(String url) {
//        return doPost(url, null);
//    }
//
//    public static String doPostJson(String url, String json) {
//        // 创建Httpclient对象
//        CloseableHttpClient httpClient = getHttpClient();
//        CloseableHttpResponse response = null;
//        String resultString = "";
//        try {
//            // 创建Http Post请求
//            HttpPost httpPost = new HttpPost(url);
//            // 创建请求内容
//            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
//            httpPost.setEntity(entity);
//            // 执行http请求
//            response = httpClient.execute(httpPost);
//            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                response.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//
//        return resultString;
//    }
//
//
//    public static void main(String[] args) {
//
//        int i = 0;
//        while (i++ < 1000) {
//
//            String json = "{" +
//                    "\"rfIds\": [\"E0040150F39D819F\"]," +
//                    "\"barCodes\":[\"\"]" +
//                    "}";
//
//            String resp = HttpClientUtil.doPostJson("http://127.0.0.1:8912/cabinetHouse/barCode/query", json);
//
//            System.out.println(resp);
//
//            resp = HttpClientUtil.doGet("http://192.168.9.158/api/cabinetHouse/cabinetHouseInfo/page", new HashMap<>(0));
//
//            System.out.println(resp);
//
//            json = "{" +
//                    "\"ids\": [3]" +
//                    "}";
//
//            resp = HttpClientUtil.doPostJson("http://127.0.0.1:8912/cabinetHouse/cabinetHouseInfo/disableBatch", json);
//
//            System.out.println(resp);
//        }
//    }
//}
